import axios from 'axios'
import { setToken, getToken, getRefreshToken } from './auth'
import { refreshToken } from '../api/user'
import config from '../config/config'


const Axios = axios.create({
    baseURL: config.baseUrl,
    timeout: 10000
});



// 对每一次的请求进行拦截，默认自动全补上token，无论是否不需要带token去请求
Axios.interceptors.request.use(
    (config) => {
        let token = getToken()
        console.log(token);
        if (token) {
            console.log("正在往请求头添加token...");
            config.headers['Authorization'] = 'Bearer ' + token
        }
        return config
    }, (err) => {
        console.log("没有通过拦截器");
        return Promise.reject(err)
    }
)




// 对每一次的服务器响应进行拦截，主要为了悄悄地刷新token，并重新执行当前因为token失效被响应拦截的请求
Axios.interceptors.response.use(
    async(response) => {
        console.log("已捕获到响应信息,点击获取详情...");
        if (response.status === 200) {
            return response.data //后端成功返回的对象给被这个响应拦截下来的请求then(res)的res
        }
        return response
    }, async(err) => { //如果响应出现报错(目前猜测是后端未经过处理的异常，若401)就进来这里
        if (err.response) {
            // 后端原来返回的是一个401网络错误，无法捕获401错误，对后端token未通过验证进行自定义返回信息就可以捕获401错误
            if (err.response.status === 401) {
                console.log('当前登录已经失效，正在为你重新登录，请稍候。。。');
                let param = {
                    AccessToken: getToken(),
                    RefreshToken: getRefreshToken()
                }

                // 如果可以重新刷新获得token，则继续返回原来要进行的请求，否则清空token和refreshToken并返回错误
                refreshToken(param).then(res => {
                    if (res.accessToken != undefined && res.refreshToken != undefined) {
                        setToken(res.accessToken, res.refreshToken)
                        console.log(' 请刷新页面或者点击页面中的刷新按钮,刷新token后，正在重新执行原来（想要执行的）请求');
                        return Axios.request(err.config); // console.log(err.config);刷新token后，重新执行原来被这个响应拦截的请求
                        //而且这个放在里面必比较好，如果放在外面，那只要有一次刷新不成功(可以是因为后端打了断点超时，也可能是前端的refreshToken(param)多补充了一个then)，就会一直回调刷新请求，很明显，以后也不可能成功，将一直会死循环
                    }
                }).catch(err => {
                    //如果上面的if中出现问题了则进来这里
                    console.log(err);
                    // clearToken()
                })
            }
        }
        return Promise.reject(err)
    }
)


//暴露给api的user.js请求方法区
export default Axios